import { Member } from "./member";


/**
 * 场景
 * p2p 单人聊天
 * team 群聊
 */
export type IScene = 'p2p' | 'team';

export interface Session {
  id: string;
  scene: IScene;
  /**
   * 聊天对象
   * IM_ID或群ID
   */
  to: string;
  /** 会话更新的时间 */
  updateTime: number;
  /** 未读消息数 */
  unread: number;
  /** 此会话的最后一条消息 */
  lastMsg: string;
  msgReceiptTime?: number;
  /** 是否被置顶 */
  isTop: boolean;
  /** 置顶的扩展字段 */
  topCuston: string;
  /** 本地自定义扩展字段 */
  localCustom: string;
}


/**
 * 会话
 * @TODO: 目前会话模型是以商户和客户为主，仅有一个会话，无法实现删除 排序置顶等操作，也无法实现客服与客服直接单聊
 * 1、客服 一个客户对应多个客服
 * 2、工作人员 之间单聊
 */
export interface Converse {
  ic_id?: number;
  ic_type?: number;
  shop_id?: number;
  from_uid?: number;
  to_uid?: number;
  unread?: number;
  last_msg_time?: number;
  last_msg_content?: string;
  last_from_mid?: number;
  last_im_client?: number;
  create_time?: number;
  // client 
  messages?: Message[];
  last_msg_time_text?: string;
  // 扩展信息
  nickname?: string;
  avatar?: string;
  /**
   * 会员渠道来源 根据会话的最后 last_from_mid 联查得到
   */
  member_from_wx_type?: Member['from'];
  member_openid?: Member['openid'];
}

/**
 * 消息类型
 * 1 文字消息 2 图片 3 语音 4 视频 5 自定义消息
 */
export type MessageType = 1 | 2 | 3 | 4 | 5;

/**
 * 消息
 * TODO: 目前消息模型有个致命的问题 目前无法实现多人聊天 两个人同一个ic_id
 */
export interface Message {
  msg_id?: number;
  msg_type?: MessageType;
  msg_content?: string;
  /** 自定义消息 JSON 扩展信息 */
  msg_extends?: object;
  shop_id?: number;
  from_mid?: number;
  from_uid?: number;
  to_uid?: number;
  ic_id?: number;
  is_read?: number;
  im_client?: number;
  sent_time?: number;
  status?: 'pending' | 'success' | 'error'
  // client extend
  sent_time_str?: string;
}

/**
 * 通知
 */
export interface Notice {
  id?: number;
  type?: 'TRADE_NOTICE' | 'sms';
  action?: string;
  content?: string;
  is_read?: number;
  is_pending?: number;
  sender?: number;
  receiver_user?: number;
  receiver_member?: number;
  receiver_phone?: string;
  target?: number;
  target_type?: string;
  shop_id?: number;
  create_time?: number;
  update_time?: number;
  pend_time?: number;
  read_time?: number;
}

/**
 * Ws推送消息体
 */
export interface WsMessage {
  type: 'notice' | 'im_message';
  converse?: Converse;
  message?: Message;
  notice?: Notice;
}
